#pragma once
#include<backendshen/eigen_types.h>

namespace myslam{
namespace backend{
/*
顶点
*/
class Vertex{
public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
    /**
     * 构造函数
     * num_dimension 顶点自身维度
     * local_dimension 本地化参数维度  为-1时认为与本身维度一样
    */
    explicit Vertex(int num_dimension, int local_dimension = -1);
    ~Vertex(){};
    //返回变量维度
    int Dimension() const;

    //返回本地变量维度
    int LocalDimension() const;

    //该顶点的id
    unsigned long Id() const{
        return id_;
    }

    //返回参数值
    VecX Parameters() const
    {
        return parameters_;
    }
    VecX& Parameters()
    {
        return parameters_;
    }

    //设置参数值
    void SetParameters(const VecX &params) { parameters_ = params; }

    //返回顶点的名称 在子类中实现
    virtual std::string TypeInfo() const = 0;

    //加法 可重新定义
    virtual void Plus(const VecX delta);
    int OrderingId() const { return ordering_id_; }
    void SetOrderingId(unsigned long id) { ordering_id_ = id; }
    void SetFixed(bool fixed=true)
    {
        fixed_ = fixed;
    }
    //测试该点是否被固定
    bool IsFixed() const { return fixed_; }

protected:
    VecX parameters_;  //实际存储的变量值
    int local_dimension_;   //局部参数化维度
    unsigned long id_;   //顶点的id  自动生车
    //ordering_id_=6 等于hessian中第六列
    unsigned long ordering_id_ = 0;
    bool fixed_=false;  //是否固定
};
}
}


